// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database();
/*
云函数名称：订单下发云函数(orderId)

基本步骤：
      1.将临时订单信息转正式订单信息
      2.删除临时订单信息
      3.通知打印

返回格式: {result:success/fail, error:'错误说明',more:''}
*/

exports.main = async (event, context) => {

  let orderId = event.orderId

  // ********************【1. 临时订单信息转正式订单信息】********************
  let tempOrderSelect = await db.collection('temp_orders').where({ orderId: orderId }).get()
  //------------- 错误检测-err01：数据库访问是否正常
  if (tempOrderSelect.errMsg != 'collection.get:ok') {
    return { result: 'fail', error: 'err01:网络错误', more: 'temp_orders无法读取' }
  }
  //------------- 错误检测-err02：临时订单是否获取正常
  let tempOrder = tempOrderSelect.data[0]  // 获取临时订单信息
  if (!tempOrder) {
    return { result: 'fail', error: 'err02:网络错误', more: '未找到临时订单[' + orderId + ']' }
  }

  // 1.1 生成订单取餐号
  let orderDate = tempOrder.orderDate
  let todayOrdersCount = await db.collection('orders').where({ orderDate: orderDate }).count()
  //------------- 错误检测-err03：当日订单总数获取是否正常
  if (todayOrdersCount.errMsg != 'collection.count:ok') {
    return { result: 'fail', error: 'err03:网络错误', more: '获取' + orderDate + '日订单总数量失败' }
  }
  let simpleId = todayOrdersCount.total + 1;
  tempOrder.oneDayId = simpleId
  tempOrder.simpleId = ('0000' + simpleId).substr(-4)

  // 1.2 将支付方式修改为：微信支付
  tempOrder.payType = '微信支付'

  // 1.3 将修正后的订单信息 写入表 orders
  let orderInfoAdd = await db.collection('orders').add({ data: tempOrder })
  //------------- 错误检测-err04：订单信息写入 orders 是否正常
  if (orderInfoAdd.errMsg != 'collection.add:ok') {
    return { result: 'fail', error: 'err04:网络错误', more: '中转订单[' + orderId + ']写入表orders失败' }
  }

  // ********************【2. 删除临时订单信息】********************

  let tempOrderRemove = await db.collection('temp_orders').where({ orderId: orderId }).remove()
  //------------- 错误检测-err04：临时订单信息删除是否正常
  if (tempOrderRemove.errMsg != 'collection.remove:ok') {
    return { result: 'fail', error: 'err04:网络错误', more: '中转订单[' + orderId + ']删除失败' }
  }

  // ********************【3. 通知打印 】********************
  let printer = await cloud.callFunction({
    // 要调用的云函数名称
    name: 'printOrder',
    // 传递给云函数的参数
    data: {
      orderId: orderId
    }
  })
  //------------- 错误检测-err05：小票打印云函数运行是否正常
  if (printer.errMsg != 'callFunction:ok') {
    return { result: 'fail', error: 'err05:打印小票云函数执行失败', more: '订单[' + orderId + ']小票打印下发失败' }
  }
  //------------- 错误检测-err06：小票打印执行是否正常
  if (printer.result.result != 'success') {
    return { result: 'fail', error: 'err06:下发小票打印失败', more: '订单[' + orderId + ']小票打印下发失败' }
  }


  // ********************【运行至此说明所有操作无误】********************
  return { result: 'success', order: tempOrder, error: '', more: '' }
}